#include <stdio.h>
#include "global.h"
#include "MsgUtils.h"
#include <pthread.h>
#include "SendConfigRequest.h"
#include <glib.h>
#include "SendHeartRequset.h"

// 弄两个参数，来装网关ip和sn
char* gatewayIp;
char* sn;

/**
 * 获取网关ip，从配置文件中获取就可以了
 * 网关ip获取需要考虑的问题？
 * 1 boa还没有进行配置，主进程就已经要开始发送心跳请求了，此时ini配置文件中没有内容，那么就拿不到网关ip,怎么办？
 *      在发送心跳请求时，先判断一下，如果没有网关ip，先跳过本次请求不发送
 * 2 boa已经配置了并且已经读取了网关ip，此时网关ip就是放在内存中。但是此时boa再次修改了网关ip配置
 *      在发送配置请求的时候，再次重新从配置文件中读取网关ip，并且要能够同步修改到外面的gatewayIp
 */
char* getGatewayIp()
{
    if(gatewayIp != NULL)
    {
        return gatewayIp;
    }

    GKeyFile *file = g_key_file_new();
    g_key_file_load_from_file(file,"../config/config.ini",G_KEY_FILE_NONE,NULL);
    gchar* path = g_key_file_get_string(file,"config","deviceInfoPath",NULL);

    GKeyFile *keyFile = g_key_file_new();
    g_key_file_load_from_file(keyFile,path,G_KEY_FILE_NONE,NULL);
    gatewayIp = g_key_file_get_string(keyFile,"config","gatewayIp",NULL);

    g_key_file_free(keyFile);
    g_key_file_free(file);
    return gatewayIp;
}


/**
 * sn:就是当前广告机的一个唯一标识
 * 方式一： 使用设备的唯一识别编码【推荐使用这种】
 *      目前我们使用方式一是会有一个问题的，我们现在的系统是vmare虚拟出来的机器上安装的ubuntu,因此这个识别码就是vmare
 *      虚拟生成出来的，虚拟生成出来的这个码是有问题的
 * 方式二： 让厂家在出厂的时候，去定制化的生产一个文件写在板子里面，这个文件中会有一个唯一的编码，要求这个编码是要唯一不重复的(雪花算法、UUID)
 */
char* getSn()
{
    if(sn != NULL)
    {
        return sn;  // 如果之前已经获取到sn，那么久直接返回即可，没有必要再次获取
    }
    //打开文件
    //FILE* file =  fopen("/sys/class/dmi/id/product_serial","r");
    //给sn分配空间
    //sn = (gchar *)calloc(1,128);
    //读取一行数据到sn
    //fgets(sn,128,file);
    sn = "1234567890";
    g_print("sn=%s\n",sn);
    return sn;
}

void* recvConfigMsg(void* param){
    while (1)
    {
        int mqId = getMsgQueue();
        if (mqId == -1)
        {
            perror("getMsgQueue error");
            pthread_exit(NULL);
        }
        Message msg = {
            .type = 1
        };
        int ret = recvMsg(mqId,&msg,MSG_SIZE);
        if (ret == -1)
        {
            perror("recvMsg error");
            pthread_exit(NULL);
        }
        printf("recv msg success  msg_type=%ld  msg_text=%s\n",msg.type,msg.text);

        //发起请求到服务端
        sendConfigRequest(&gatewayIp,getSn());
    }
}

int main(int argc, char const *argv[])
{
    printf("boa_main start\n");
    pthread_t tid;
    pthread_create(&tid,NULL,recvConfigMsg,NULL);

    // 模拟心跳
    while (1)
    {
        sleep(2);
        char* ipTmp = getGatewayIp();
        printf("ip=%s\n",ipTmp);
        if (ipTmp == NULL)
        {
            continue;
        }
        sendHeartRequest(ipTmp,getSn());
        printf("-------------------\n");
    }
    
    return 0;
}
